#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: WangYongCun
# Environment: python 3.5.1
import getpass, datetime, sys
start_mes = '''
    #######################################################################
                 欢迎来到用户登陆系统，请按照提示操作。
    #######################################################################
'''
end_mes = '''
    #######################################################################
'''
end_over = '''
    #######################################################################
                                 再见
    #######################################################################
'''
try:
    with open('user.txt', 'r') as f: # 获取用户信息
        user_dict = {}  # 创建用户信息空字典
        for each_line in f.readlines():   # 获取所有user.txt文件中用户的密码
            name, pass_word = each_line.split(':')[0],each_line.split(':')[1] # 提取信息
            user_dict[name] = pass_word  # 将user.txt文件中的用户和密码加入到字典user_dict中

    with open('blacklist.txt', 'r') as f:  # 获取黑名单中用户
        blacklist = []  # 程序初始黑名单列表为空，即不存在黑名单用户
        for line in f.readlines():
            each_line = line.strip()
            blacklist.append(each_line) # 将本地的黑名单用户导入黑名单列表
except FileNotFoundError: # 如果发生文件不存在错误，直接输出提示，并退出程序
    print('    缺少配置文件，请检查user.txt和blacklist.txt ...')
    sys.exit(1)

print(start_mes) # 输出欢迎界面
input_name = str(input('    请输入用户名: '))  # 输入用户名
if input_name in blacklist:  # 判断输入的用户名是否在黑名单中，如果在直接退出登录程序
    print('        对不起，用户%s已经禁止登陆，请联系管理员！' % input_name)
    print(end_mes)
else:
    counter = 3  # 剩余输入密码次数计数器
    for i in range(3):  # 密码输入循环最多3次
        input_password = getpass.getpass('    请输入密码: ') # 获取用户输入的密码
        if input_name in user_dict and input_password == user_dict[input_name]:  # 判断输入的用户名与密码是否匹配
            print('        登陆成功 !\n        欢迎用户：%s ' % input_name)  # 登陆成功提示
            now = datetime.datetime.now()  # 获取当前时间
            login_time = now.strftime('%Y-%m-%d %H:%M:%S')  # 格式化当前时间
            print('        系统登陆时间：%s' % login_time)  # 显示登陆成功时间
            print(end_mes)
            with open('login.log', 'a+') as f:
                f.write('登陆时间：%s；用户：%s；状态：成功\n' % (login_time, input_name))  # 记录登陆信息
            break  # 登录成功跳出整个循环
        else:  # 用户与密码不匹配的处理
            counter = counter - 1  # 每输入错误一次，计数器将自减1
            if counter == 0:  # 计数器为0时也就是连续输入错误了3次，锁定账号
                with open('blacklist.txt', 'a+') as f:  # 创建黑名单，如果已经有黑名单，就追加
                    f.write('%s\n' % input_name)  # 将用户加入黑名单
                print('        错误提示：对不起，已经连续输入错误3次，账号%s已经被锁定。\n        如果疑问请与管理员联系！' % input_name)
                print(end_mes)
                now = datetime.datetime.now()  # 获取当前时间
                login_time = now.strftime('%Y-%m-%d %H:%M:%S')  # 格式化当前时间
                with open('login.log', 'a+') as f:
                    f.write('登陆时间：%s；用户：%s；状态：锁定\n' % (login_time, input_name))  # 记录登陆信息
                break
            else:
                print('        错误提示：对不起，用户与密码不匹配。\n        账号与密码累计3次输入错误，该账号将被锁定！\n        %s用户还有%s次机会' % (input_name, counter) )
                now = datetime.datetime.now()  # 获取当前时间
                login_time = now.strftime('%Y-%m-%d %H:%M:%S')  # 格式化当前时间
                with open('login.log', 'a+') as f:
                    f.write('登陆时间：%s；用户：%s；状态：失败\n' % (login_time, input_name))  # 记录登陆信息
                quit = str(input('        可以通过输入 q 退出，其他任意键重新输入密码: '))
                if quit == 'q': # 每次密码输入错误，用户可以选择退出程序
                    now = datetime.datetime.now()  # 获取当前时间
                    login_time = now.strftime('%Y-%m-%d %H:%M:%S')  # 格式化当前时间
                    with open('login.log', 'a+') as f:
                        f.write('登陆时间：%s；用户：%s；状态：退出\n' % (login_time, input_name))  # 记录登陆信息
                    print(end_over)
                    break
                else:
                    continue # 用户没有选择退出，就跳出当次循环,进入下一次循环输入密码